package pe.edu.upc.dai.grupovictor.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dai.grupovictor.dao.NotaCursoDao;
import pe.edu.upc.dai.grupovictor.dao.util.ConnectionUtils;
import pe.edu.upc.dai.grupovictor.dao.util.DaoException;
import pe.edu.upc.dai.grupovictor.model.Alumno;
import pe.edu.upc.dai.grupovictor.model.NotaCurso;
import pe.edu.upc.dai.grupovictor.model.ProgramaCurso;
import pe.edu.upc.dai.grupovictor.model.TipoEvaluacion;

public class NotaCursoDaoImpl implements NotaCursoDao {
    
    private Connection connection;

    public void iniciarConnection(Connection connection){
        this.connection = connection;
    }

    public Long getIdSiguiente() {
        PreparedStatement st = null;
        ResultSet rs = null;
        Long id = null;

        try {
            st = connection.prepareStatement("" +
                    "select nvl(max(id_nota_curso),0)+1 id " +
                    "from NOTA_CURSO ");
            rs = st.executeQuery();
            if (rs.next()) {
                id = rs.getLong("ID");
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
        }
        return id;
    }

    public void insertar(List<NotaCurso> notas) {

        PreparedStatement st = null;
        try {

            for (NotaCurso nota : notas) {
                Long id = getIdSiguiente();
                nota.setIdNotaCurso(id);

                st = connection.prepareStatement("" +
                        "INSERT INTO NOTA_CURSO" +
                        "(ID_NOTA_CURSO,ID_ALUMNO,ID_SECCION,ID_TIPO_EVALUACION,NOTA,PESO) " +
                        "VALUES(?, ?, ?, ?, ?, ?)");
                st.setLong(1, nota.getIdNotaCurso());
                st.setLong(2, nota.getIdAlumno().getIdAlumno());
                st.setLong(3, nota.getIdSeccion().getIdSeccion());
                st.setLong(4, nota.getIdTipoEvaluacion().getIdTipoEvaluacion());
                st.setFloat(5, nota.getNota());
                st.setFloat(6, nota.getPeso());

                st.execute();
            }
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
        }
    }

    public NotaCurso getNotaAlumno(NotaCurso nota) {

        NotaCurso notaExiste = null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try {
            st = connection.prepareStatement("" +
                    "SELECT NC.ID_NOTA_CURSO, " +
                    "       NC.ID_ALUMNO, " +
                    "       NC.ID_SECCION, " +
                    "       NC.ID_TIPO_EVALUACION, " +
                    "       NC.NOTA, " +
                    "       NC.PESO " +
                    "FROM NOTA_CURSO NC " +
                    "WHERE NC.ID_ALUMNO = ? " +
                    "AND NC.ID_SECCION = ? " +
                    "AND NC.ID_TIPO_EVALUACION = ? ");
            st.setLong(1, nota.getIdAlumno().getIdAlumno());
            st.setLong(2, nota.getIdSeccion().getIdSeccion());
            st.setLong(3, nota.getIdTipoEvaluacion().getIdTipoEvaluacion());
            rs = st.executeQuery();
            if (rs.next()) {
                notaExiste = new NotaCurso();
                notaExiste.setIdNotaCurso(rs.getLong("ID_NOTA_CURSO"));
                notaExiste.setNota(rs.getFloat("NOTA"));
                notaExiste.setPeso(rs.getFloat("PESO"));

                notaExiste.setIdAlumno(new Alumno(rs.getLong("ID_ALUMNO")));
                notaExiste.setIdSeccion(new ProgramaCurso(rs.getLong("ID_SECCION")));
                notaExiste.setIdTipoEvaluacion(new TipoEvaluacion(rs.getLong("ID_TIPO_EVALUACION")));
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
        }

        return notaExiste;
    }

    public void actualizar(List<NotaCurso> notas) {
        PreparedStatement st = null;
        try {

            for (NotaCurso nota : notas) {

                st = connection.prepareStatement("" +
                        "UPDATE NOTA_CURSO " +
                        "SET ID_ALUMNO = ?, " +
                        "   ID_SECCION = ?, " +
                        "   ID_TIPO_EVALUACION = ?, " +
                        "   NOTA = ?, " +
                        "   PESO = ? " +
                        "WHERE ID_NOTA_CURSO = ? ");
                st.setLong(1, nota.getIdAlumno().getIdAlumno());
                st.setLong(2, nota.getIdSeccion().getIdSeccion());
                st.setLong(3, nota.getIdTipoEvaluacion().getIdTipoEvaluacion());
                st.setFloat(4, nota.getNota());
                st.setFloat(5, nota.getPeso());
                st.setLong(6, nota.getIdNotaCurso());

                st.execute();
            }
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
        }
    }

    public NotaCurso seleccionarPorPrimaryKey(Long id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public NotaCurso seleccionarPorNombre(String nombre) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void eliminar(NotaCurso notaCurso) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<NotaCurso> seleccionarTodos() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<NotaCurso> getNotasAlumno(Alumno alumno, ProgramaCurso seccion){
        PreparedStatement st = null;
        ResultSet rs = null;
        NotaCurso nota = null;
        List<NotaCurso> lista = new ArrayList<NotaCurso>();
        try {
            String sql = "" +
                    "SELECT NC.ID_NOTA_CURSO, " +
                    "       NC.ID_ALUMNO, " +
                    "       NC.ID_SECCION, " +
                    "       NC.ID_TIPO_EVALUACION, " +
                    "       NC.NOTA, " +
                    "       NC.PESO " +
                    "  FROM NOTA_CURSO NC " +
                    " WHERE NC.ID_ALUMNO = ? " +
                    "   AND NC.ID_SECCION = ? ";

            st = connection.prepareStatement(sql);

            st.setLong(1, alumno.getIdAlumno());
            st.setLong(2, seccion.getIdSeccion());
            rs = st.executeQuery();
            while (rs.next()) {
                nota = new NotaCurso();
                nota.setIdAlumno(new Alumno(rs.getLong("ID_ALUMNO")));
                nota.setIdSeccion(new ProgramaCurso(rs.getLong("ID_SECCION")));
                nota.setIdTipoEvaluacion(new TipoEvaluacion(rs.getLong("ID_TIPO_EVALUACION")));
                
                nota.setIdNotaCurso(rs.getLong("ID_NOTA_CURSO"));
                nota.setNota(rs.getFloat("NOTA"));
                nota.setPeso(rs.getFloat("PESO"));

                lista.add(nota);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
        }
        return lista;
    }
}
